home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / sys / 2b_mv_os2_src.lha / MultiView Src / MultiView.e < prev    next >
Encoding:
Text File  |  1999-05-08  |  13.2 KB  |  572 lines

  1. /*
  2.  * MultiView NG
  3.  *
  4. PROC historia programu
  5.  *
  6.  *  15.02.1999
  7.  *  Zaczynam pracë.
  8.  *
  9.  *  geticon wrzucona z powrotem DO gîównego pliku
  10.  *  inne procedury zmienione sâ
  11.  *  show_error(body,title) -> request(title,body)
  12.  *  nowa procka check_and_run() -> sprawdza, depakuje, uruchamia
  13.  *
  14.  *  02.03.1999
  15.  *
  16.  *  Przerobiê :
  17.  *
  18.  *    - pobraê nazwy plików
  19.  *    - sprawdzic via FileID, datatype
  20.  *    - Odszukaê tooltype
  21.  *    - Jeôli nie ma a jest PACKED ale nieARCHIVE TO unpack()
  22.  *    - sprawdziê znowu
  23.  *    - odszukaê tooltype
  24.  *
  25.  *  25.03.1999
  26.  *
  27.  *  Zmiany :
  28.  *    - geticon() nowa
  29.  *    - zmiany w unpack() - krótsza
  30.  *    - zmiany w read/writefile() - obsîuga bîëdów przekazana wyûej (unpack())
  31.  *
  32.  *  Wersja 4.82 (14.04.1999)
  33.  *
  34.  *  Mozliwoôê zewnëtrzego pokazania AmigaGuide
  35.  *    - w runcmd() nie ma obsîugi AmigaGuide jako takiego
  36.  *    - w get_def() jak nie ma ttypa a jest aguide TO RETURN datatype
  37.  *
  38.  *  - wyrzucona procedura noguide()
  39.  *  - w obsluz() zmieniona tresc warunku - nie ma juz zbednego filerequestera przy startach z WB
  40.  *
  41.  *  Wersja 4.90 (009.05.1999)
  42.  *
  43.  *  Wstawione ograniczenia wersji niezarejestrowanej
  44.  *  Zmienione EasyRequestArgs na request()
  45.  *  Wersja unreg ma wstawiony UAE_Detect
  46.  *  Jesli DT-> Decompressor TO packed := TRUE
  47.  *
  48. ENDPROC
  49.  *
  50.  */
  51.  
  52. OPT OSVERSION = 37, PREPROCESS
  53.  
  54. MODULE 'dos/dos',            'dos/datetime',
  55.        'dos/dostags',        'exec/memory',
  56.        'workbench/startup',  'workbench/workbench',
  57.        'fileid',             'libraries/fileid',
  58.        'Fabio/ttparse_oo',   'libraries/fileid_iddefs',
  59.        'asl',                'libraries/asl',
  60.        'datatypes',          'datatypes/datatypesclass',
  61.        'datatypes/datatypes','icon',
  62.        'wb',
  63.  
  64.        '*mv_consts',
  65.        '*mv_version',
  66.        '*mv_guide',
  67.        '*mv_locale',
  68.        '*mv_asl'
  69.  
  70. #ifdef VER_FULL
  71.  
  72. MODULE '*mv_xfd',
  73.        '*mv_ext'
  74. #endif
  75.  
  76. DEF filename[256] : STRING,
  77.     progname[256] : STRING,        ->  nazwa pliku z programem
  78.     error   [300] : STRING,        ->  text bîëdu
  79.     screen  [60]  : STRING,        ->  nazwa screena dla guide()
  80.     textlist[21]  : LIST           ->  lista ze stringami
  81.  
  82. DEF ttype : PTR TO ttparse,        ->  ikona
  83.     fib   : PTR TO fi_fileinfo,    ->  FileID structure
  84.     req   : PTR TO filerequester,  ->  Potrzebny jesli multiselect
  85.     dth   : PTR TO datatypeheader  ->  Datatypes name
  86.  
  87. DEF aguide = FALSE,                ->  AmigaGuide ?
  88.     kick   = FALSE,                ->  czy Kickstart >=39
  89.     cli    = FALSE,                ->  CLI mode
  90.     info   = TRUE,                 ->  Show INFO ?
  91.     pier   = TRUE,                 ->  Pierwszy plik ? - jak FALSE -> quit
  92.     packed = FALSE
  93.  
  94. PROC main() HANDLE
  95.  
  96. DEF argmsg : PTR TO wbstartup,
  97.     wb_arg : PTR TO wbarg,
  98.     myargs : PTR TO LONG,
  99.     files  : PTR TO LONG,
  100.     file   = NIL,
  101.     rdargs = NIL
  102.  
  103.   textlist := locale()
  104.   getIcon()
  105.   StrCopy(filename,progname)
  106.   version(progname)
  107.  
  108.   IF KickVersion(39) THEN kick := TRUE
  109.  
  110.   IF (fileidbase := OpenLibrary('FileID.library',2)) <> NIL
  111.     IF (fib := FiAllocFileInfo()) = NIL THEN Raise(ERR_ALLOC)
  112.   ENDIF
  113.  
  114.   datatypesbase := OpenLibrary('datatypes.library',39)
  115.  
  116.  
  117.   IF wbmessage
  118.  
  119. ->    WriteF('Started from WB\n')
  120.  
  121.     screen := NIL
  122.     argmsg := wbmessage
  123.     wb_arg := argmsg.arglist
  124.  
  125. ->    WriteF('Mam \d parametrów\n',argmsg.numargs)
  126.  
  127.     IF argmsg.numargs > 1
  128.       obsluz(wb_arg,argmsg.numargs,TRUE)
  129.     ELSE
  130.       pier := no_params()
  131.     ENDIF
  132.  
  133.   -> CLI mode
  134.  
  135.   ELSE
  136.  
  137. ->    WriteF('Started From CLI\n')
  138.  
  139.     myargs := [NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL]
  140.     IF rdargs := ReadArgs('FILE/M,PUB=PUBSCREEN/K,REQ=REQUESTER/S,APPICON/S,CLIPBOARD/S,CLIPUNIT/K/N,SCREEN/S,BOOKMARK/S,FONTNAME/K,FONTSIZE/K/N,BACKDROP/S,WINDOW/S',myargs,NIL)
  141.       cli := TRUE
  142.       IF myargs[2]                    -> REQ
  143.         cli  := FALSE
  144.         info := TRUE
  145.       ENDIF
  146.       IF myargs[1]                    -> PUB
  147.         StrCopy(screen,myargs[1])
  148.       ELSE
  149.         screen := NIL
  150.       ENDIF
  151.       IF myargs[3]                    -> APPICON
  152.         cli := FALSE
  153.         appicon()
  154.         Raise(ERR_EXIT)
  155.       ENDIF
  156.       files := myargs[NIL]            -> FILE
  157.       IF files
  158.         WHILE files[]
  159.           StrCopy(filename,files[file])
  160.           check_and_run()
  161.           files[]++
  162.         ENDWHILE
  163.       ELSE
  164.         pier := no_params(TRUE)
  165.       ENDIF
  166.     ELSE
  167.       pier := no_params(TRUE)
  168.     ENDIF
  169.   ENDIF
  170.  
  171. EXCEPT DO
  172.  
  173. ->  WriteF('Zaczynam wychodziê\n')
  174.  
  175.   IF fib            THEN FiFreeFileInfo(fib)
  176.   IF fileidbase     THEN CloseLibrary(fileidbase)
  177.   IF rdargs         THEN FreeArgs(rdargs)
  178.   IF req            THEN FreeAslRequest(req)
  179.   IF aslbase        THEN CloseLibrary(aslbase)
  180.   IF datatypesbase  THEN CloseLibrary(datatypesbase)
  181.  
  182.   END ttype
  183.  
  184. ->  WriteF('Zwolniîem wszystko\n')
  185.  
  186.   IF exception
  187.     SELECT exception
  188.       CASE ERR_CHECK
  189.         IF pier
  190.           StrCopy(error,textlist[ERR_CHECK])
  191.           StrAdd(error,filename)
  192.           StrAdd(error,' !')
  193.         ELSE
  194. ->          WriteF('Wychodzë bo nie pier\n')
  195.           CleanUp(NIL)
  196.         ENDIF
  197.       CASE ERR_EXIT
  198. ->        WriteF('Wychodzë bo ERR_EXIT\n')
  199.         CleanUp(NIL)
  200.       DEFAULT
  201.         IF exception < 20
  202.           StrCopy(error,textlist[exception])
  203.         ELSE
  204.           StrCopy(error,textlist[ERR_UNKNOWN])
  205.         ENDIF
  206.     ENDSELECT
  207.     request(textlist[MSG_INFO_TITLE],error)
  208.   ENDIF
  209.  
  210.  -> WriteF('Wychodzë normalnie\n')
  211.  
  212.   CleanUp(NIL)
  213.  
  214. ENDPROC
  215. PROC fileidcheck()
  216.  
  217. DEF id
  218.  
  219.   IF (FiIdentifyFromName(fib,filename)) = NIL
  220.   ELSE
  221.     Raise(ERR_CHECK)
  222.   ENDIF
  223.   aguide := FALSE
  224.  
  225.   id := fib.fi_id
  226.   IF (fib.fi_globalfileclass = FIGFCF_PACKED) OR ((id > 3) AND (id < 17)) OR (id = 39) OR (id = $1e2) OR (id = $1eb) OR (id = $1e0) OR (id = $1e7) OR (id = $21d) OR (id = $214) OR (id = $248) OR (id = $249) OR (id = $1a0) OR (id = $1b7) THEN packed := TRUE
  227.  
  228. ENDPROC fib.fi_description
  229. PROC runcmd()
  230.  
  231. DEF cmd[200] : STRING,   -> Komenda
  232.     tmp[200] : STRING,
  233.     run[512] : STRING,   -> Execute() string
  234.     succ = TRUE
  235.  
  236.   cmd := NIL
  237.  
  238.   IF fileidbase THEN cmd := fileidrun()
  239.  
  240.   IF cmd = NIL
  241.     IF datatypesbase THEN cmd := datatypesrun()
  242.     IF cmd = NIL
  243.  
  244. #ifdef VER_FULL
  245.       StrCopy(tmp,get_suffix(filename))        -> sprawdzamy rozszerzenie
  246.       cmd := ttype.get(tmp)
  247.       IF cmd
  248.       ELSE
  249.         StrCopy(tmp,get_prefix(filename))   -> wiëc moûe przedrostek
  250.         cmd := get_def(tmp)
  251.       ENDIF
  252. #endif
  253.  
  254.       IF cmd = NIL THEN cmd := get_def('DEFAULT3')
  255.     ENDIF
  256.   ENDIF
  257.  
  258. #ifdef VER_FULL
  259.  
  260.   IF (succ := InStr(cmd,'%f')) > -1
  261.  
  262.     StrCopy(tmp,'Run ')
  263.     StrAdd(tmp,cmd,succ)
  264.     StrAdd(tmp,filename)
  265.     MidStr(run,cmd,succ + 2,ALL)
  266.     StrAdd(tmp,run)
  267.     StrCopy(run,tmp,ALL)
  268.  
  269.   ELSEIF (succ := InStr(cmd,'%p')) > -1
  270.  
  271.     StrCopy(tmp,'Run ')
  272.     StrAdd(tmp,cmd,succ)
  273.     StrCopy(filename,get_fullname('',filename))
  274.     StrAdd(tmp,filename)
  275.     MidStr(run,cmd,succ + 2,ALL)
  276.     StrAdd(tmp,run)
  277.     StrCopy(run,tmp,ALL)
  278.  
  279.   ELSE
  280. #endif
  281.  
  282.     StringF(run,'Run \s "\s" \0\n',cmd,filename)
  283. #ifdef VER_FULL
  284.   ENDIF
  285. #endif
  286.  
  287.   StrCopy(tmp,cmd)
  288.   UpperStr(tmp)
  289.  
  290.   IF StrCmp(tmp,'DATATYPE',ALL)
  291.     succ := guide(filename,39,screen)
  292.     IF succ
  293.     ELSE
  294.       request('MultiView Info',textlist[ERR_NO_AGUIDE])
  295.       cmd := get_def('DEFAULT3')
  296.       UpperStr(cmd)
  297.       IF StrCmp(cmd,'DATATYPE',ALL)
  298.         StrCopy(cmd,'C:More')
  299.         StrCopy(error,textlist[ERR_MORE])
  300.         request(textlist[MSG_INFO_TITLE],error)
  301.       ENDIF
  302.       StringF(run,'Run  \s "\s" \0\n',cmd,filename)
  303.       Execute(run,NIL,NIL)
  304.     ENDIF
  305.   ELSE
  306.     Execute(run,NIL,NIL)
  307.   ENDIF
  308.  
  309. ENDPROC
  310. PROC get_def(ttyp)
  311.  
  312. DEF cmd[200] : STRING  -> Komenda
  313.  
  314.   cmd := ttype.get(ttyp)
  315.   IF cmd
  316.   ELSE
  317.     IF aguide THEN RETURN 'DATATYPE'
  318.     IF kick
  319.       cmd := ttype.get('DEFAULT3')
  320.       IF cmd THEN RETURN cmd
  321.     ENDIF
  322.     cmd := ttype.get('DEFAULT')
  323.     IF cmd
  324.     ELSE
  325.       RETURN 'DATATYPE'
  326.     ENDIF
  327.   ENDIF
  328.  
  329. ENDPROC cmd
  330. PROC obsluz(wb_arg : PTR TO wbarg,num,wb = FALSE)
  331.  
  332. DEF ktr = NIL
  333.  
  334.   IF wb
  335.     wb_arg++
  336.     ktr := 1
  337.   ENDIF
  338.   FOR ktr := ktr TO num
  339.     filename[NIL] := NIL
  340.     aguide  := FALSE
  341.     IF wb_arg.lock > NIL
  342.       CurrentDir(wb_arg.lock)
  343.       filename := wb_arg.name
  344.       IF StrLen(filename) > NIL
  345.         check_and_run()
  346.       ENDIF
  347.     ENDIF
  348.     wb_arg++
  349.   ENDFOR
  350.  
  351. ENDPROC
  352. PROC appicon() HANDLE
  353.  
  354. DEF dobj      : PTR TO diskobject,
  355.     appmsg    : PTR TO appmessage,
  356.     myport    = NIL,
  357.     appicon   = NIL,
  358.     quit      = FALSE,
  359.     ok,
  360.     a
  361.  
  362.   dobj := NIL
  363.  
  364.   IF (iconbase      := OpenLibrary('icon.library',      37)) = NIL THEN Raise(ERR_NO_APPICON)
  365.   IF (workbenchbase := OpenLibrary('workbench.library', 37)) = NIL THEN Raise(ERR_NO_APPICON)
  366.  
  367.   dobj              := GetDiskObject(progname)
  368.  
  369.   IF dobj
  370.     dobj.type       := NIL
  371.     IF (myport      := CreateMsgPort()) <> NIL
  372.       IF (appicon   := AddAppIconA(NIL, NIL, 'MultiView', myport, NIL, dobj, NIL)) <> NIL
  373.  
  374.         REPEAT
  375.           appmsg := NIL
  376.           WaitPort(myport)
  377.           quit := FALSE
  378.  
  379.           WHILE appmsg := GetMsg(myport)
  380.             IF appmsg.numargs = NIL         -> ikonka clicknieta
  381.               ok := EasyRequestArgs(NIL,[20,NIL,textlist[MSG_INFO_TITLE],textlist[MSG_APP_INFO],textlist[MSG_APP_GADGETS]],NIL,NIL)
  382.               SELECT ok
  383.                 CASE 1
  384.                   quit := TRUE
  385.                 CASE 2
  386.                   a := file_req(textlist[MSG_ASL_FR],screen)
  387.                   IF a
  388.                     obsluz(req.arglist,req.numargs)
  389.                   ENDIF
  390.               ENDSELECT
  391.             ELSEIF appmsg.numargs > NIL     -> Coô dropniëto
  392.               obsluz(appmsg.arglist, appmsg.numargs - 1)
  393.             ENDIF
  394.             ReplyMsg(appmsg)
  395.           ENDWHILE
  396.  
  397.         UNTIL quit
  398.  
  399.       ENDIF
  400.     ENDIF
  401.   ENDIF
  402.  
  403. EXCEPT DO
  404.  
  405.   IF appicon        THEN RemoveAppIcon(appicon)
  406.   IF dobj           THEN FreeDiskObject(dobj)
  407.   IF workbenchbase  THEN CloseLibrary(workbenchbase)
  408.   IF iconbase       THEN CloseLibrary(iconbase)
  409.  
  410.   ReThrow()
  411.  
  412. ENDPROC
  413. PROC datatypescheck()
  414.  
  415. DEF dtn      : PTR TO datatype,
  416.     lock
  417.  
  418.   IF (lock := Lock(filename, ACCESS_READ))
  419.     IF (dtn := ObtainDataTypeA(DTST_FILE,lock,NIL)) -> Pobieram typ pliku
  420.       dth := dtn.header
  421.       IF StrCmp(dth.name,'AmigaGuide')   THEN aguide := TRUE
  422.       IF StrCmp(dth.name,'Decompressor') THEN packed := TRUE
  423.       ReleaseDataType(dtn)
  424.     ENDIF
  425.     UnLock(lock)
  426.   ENDIF
  427.  
  428. ENDPROC dth.name
  429. PROC fileidrun()
  430.  
  431. DEF cmd[200] : STRING,   -> Komenda
  432.     run[512] : STRING,   -> Execute() string
  433.     id,                  -> typ pliku
  434.     typ
  435.  
  436.   id  := fib.fi_id
  437.   typ := fib.fi_globalfileclass
  438.  
  439.   StringF(run,'\z\r\d[3]',id)
  440.  
  441.   cmd  := ttype.get(run)              -> odczytuje xxx ttype
  442.   IF cmd
  443.   ELSE                                -> nie udaîo sië
  444.     SELECT typ
  445.       CASE FIGFCF_MUSIC_SCORE         -> muzyka
  446.         cmd := get_def('DEF_MUSIC')
  447.       CASE FIGFCF_GRAPHIC_IMAGE       -> grafika
  448.         cmd := get_def('DEF_GFX')
  449.       CASE FIGFCF_IFF_HEADER          -> IFF
  450.         cmd := get_def('DEF_IFF')
  451.       CASE FIGFCF_FORMATTED_TEXT      -> Text
  452.         cmd := get_def('DEF_TEXT')
  453.       CASE FIGFCF_EXECUTABLE          -> Exe
  454.         cmd := get_def('DEF_EXE')
  455.       CASE FIGFCF_PACKED              -> Spakowany
  456.           cmd := get_def('DEF_PACK')
  457.       CASE FIGFCF_ENCRYPTED           -> Kodowany
  458.         cmd := get_def('DEF_ENCRYPT')
  459.       CASE FIGFCF_SCRIPT              -> Skrypt
  460.         cmd := get_def('DEF_SCRIPT')
  461.       DEFAULT
  462.         cmd := NIL
  463.     ENDSELECT
  464.   ENDIF                                 -> Jeôli nie mamy FileId tooltype
  465.  
  466. ENDPROC cmd
  467. PROC datatypesrun()
  468.  
  469. DEF cmd[200] : STRING   -> Komenda
  470.  
  471.   cmd  := ttype.get(dth.name)            -> odczytuje xxx ttype
  472.   IF cmd
  473.   ELSE                                   -> nie udaîo sië
  474.     cmd := NIL
  475.   ENDIF
  476.  
  477. ENDPROC cmd
  478. PROC check()
  479.  
  480. DEF text[1024] : STRING,
  481.     temp1[256] : STRING,
  482.     temp2[256] : STRING
  483.  
  484.   IF fileidbase    THEN StringF(temp1,'\n\s \s',textlist[MSG_INFO_TYPE],fileidcheck())
  485.   IF datatypesbase THEN StringF(temp2,'\n\s \s',textlist[MSG_INFO_TYPE],datatypescheck())
  486.  
  487.   IF info
  488.     StringF(text,'\s \s',textlist[MSG_INFO_FILE],filename)
  489.     IF fileidbase    THEN StrAdd(text,temp1)
  490.     IF datatypesbase THEN StrAdd(text,temp2)
  491.  
  492.     IF cli
  493.       WriteF('\n\s\n',text)
  494.     ELSE
  495.       request('MultiView Info',text)
  496.     ENDIF
  497.   ENDIF
  498.  
  499. ENDPROC
  500. PROC check_and_run()
  501.  
  502. DEF status = TRUE
  503.  
  504. ->  WriteF('Sprawdzam plik \s\n',filename)
  505.  
  506.   check()
  507. #ifdef VER_FULL
  508.   IF packed
  509.     status := unpack(filename,textlist)
  510.     IF status THEN packed := FALSE
  511.     check()
  512.   ENDIF
  513. #endif
  514.   runcmd()
  515.  
  516. ENDPROC
  517. PROC getIcon()
  518.  
  519. DEF wbstart       : PTR TO wbstartup,
  520.     wbarg         : PTR TO wbarg,
  521.     tempname[255] : STRING,
  522.     iconname[255] : STRING,
  523.     success,
  524.     b
  525.  
  526.   NEW ttype.ttparse(FALSE)
  527.  
  528.   IF wbmessage
  529.     wbstart  := wbmessage
  530.     wbarg    := wbstart.arglist
  531.     success  := NameFromLock(GetProgramDir(),iconname,255)
  532.     AddPart(iconname,wbarg.name,256)
  533.   ELSE
  534.     success  := NameFromLock(GetProgramDir(),iconname,255)
  535.     GetProgramName(tempname,255)
  536.     AddPart(iconname,tempname,256)
  537.   ENDIF
  538.  
  539.   ttype.file(iconname)
  540.   IF ttype.error() THEN Raise(ERR_NO_ICON)
  541.  
  542. #ifdef VER_FULL
  543.   b := ttype.get('SHOWINFO')
  544.  
  545.   IF b
  546.     UpperStr(b)
  547.     IF StrCmp(b,'NO') THEN info := FALSE
  548.   ENDIF
  549. #endif
  550.  
  551.   StrCopy(progname,iconname)
  552.  
  553. ENDPROC
  554. PROC no_params(warunek = FALSE)
  555.  
  556. DEF a
  557.  
  558.   IF warunek
  559.     cli := FALSE
  560.     filename[NIL] := NIL
  561.   ENDIF
  562.  
  563.   a := file_req(textlist[MSG_ASL_FR],screen)
  564.   IF a
  565.     obsluz(req.arglist,req.numargs)
  566.   ELSE
  567.     RETURN FALSE
  568.   ENDIF
  569.  
  570. ENDPROC TRUE
  571.  
  572.